﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez;
using Tecnopez.Globals;
using BussinessLogicTecnoPez.Produccion.Compras;
using Microsoft.Practices.EnterpriseLibrary.Validation;

public partial class Modules_Compras_RegistrarRecepcionPedidoProveedor : System.Web.UI.Page
{
    const String pedidoViewStateOrdenKey = "ordenPedido";
    const String pedidoViewStateOrdenDireccionKey = "ordenDireccionPedido";
    const String detalleViewStateOrdenKey = "ordenDetalle";
    const String detalleViewStateOrdenDireccionKey = "ordenDireccionDetalle";

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.Page.IsPostBack)
        {
            SetMode(PageMode.ListMode);
            CargarComboProveedor();
        }

        InicializarGrillas();

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/configurar.gif";
        master.Titulo = "Recepción de Pedidos de Proveedores";
        cargarGrilla();
        _lblError.Text = "";
    }
    private void CargarComboProveedor()
    {
        ddlProveedor.DataTextField = "RazonSocial";
        ddlProveedor.DataValueField = "idProveedor";
        ddlProveedor.DataSource = Proveedor.getManager.GetAll();
        ddlProveedor.DataBind();

        ListItem item = new ListItem("Seleccione...", "-1");
        ddlProveedor.Items.Insert(0, item);
    }
    private void CargarComboInsumos(ArrayList objList)
    {
        ListItem objDdlItem;
        ddlInsumo.Items.Clear();
        foreach (ItemDetallePedidoProveedor objItem in objList)
        {
            objDdlItem = new ListItem(objItem.Insumo.Descripcion.Trim(), objItem.Insumo.IdInsumo.ToString());
            ddlInsumo.Items.Add(objDdlItem);
        }
    }
    private void InicializarGrillas()
    {
        grdPedidosProveedor.setupGrid<PedidoProveedor>(cargarGrilla, seleccionarPedidoProveedor, null, true, this.ViewState);
        grdDetallePedido.setupGrid<ItemDetallePedidoProveedor>(cargarGrillaDetalle, seleccionarItemDetallePedidoProveedor, null, true, this.ViewState);
        grdPedidosProveedor.PageDataViewOrdenKey = pedidoViewStateOrdenKey;
        grdPedidosProveedor.PageDataViewOrdenDireccionKey = pedidoViewStateOrdenDireccionKey;
        grdDetallePedido.PageDataViewOrdenKey = detalleViewStateOrdenKey;
        grdDetallePedido.PageDataViewOrdenDireccionKey = detalleViewStateOrdenDireccionKey;
    }

    private void seleccionarPedidoProveedor(int o)
    {
        int IdPedido = int.Parse(grdPedidosProveedor.grdDatosAbmView.DataKeys[o].Value.ToString());
        PedidoProveedor.getManager.ClearFilters();
        PedidoProveedor.getManager.AddFilter("IDPEDIDOPROVEEDOR", GenericManager<PedidoProveedor>.filterOperator.Equals, IdPedido);
        PedidoProveedor objPedido = PedidoProveedor.getManager.GetOne();
        txtID.Text = objPedido.IdPedidoProveedor.ToString();
        txtFechaCarga.Text = objPedido.Fecha.ToString();
        txtProveedor.Text = objPedido.Proveedor.ToString();
        txtEstado.Text = objPedido.TipoEstadoPedidoProveedor.ToString();
        txtEmpleado.Text = objPedido.Empleado.ToString();
        txtMoneda.Text = objPedido.TipoMoneda.ToString();
        txtTotal.Text = objPedido.Monto.ToString();

        if (objPedido.DetallePedidoProveedor != null)
            Session["detallePedidoProveedor"] = objPedido.DetallePedidoProveedor;
        cargarGrillaDetalle();

        CargarComboInsumos(objPedido.DetallePedidoProveedor.ItemList);

        txtCantidad.Text = "";
        _lblErrorDetalle.Text = "";

        SetMode(PageMode.EditMode);
    }

    private void cargarGrilla()
    {
        PedidoProveedor.getManager.ClearFilters();
        PedidoProveedor.getManager.ClearOrders();
        PedidoProveedor.getManager.AddFilter("IdPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");
        //El estado tiene que ser distinto de Anulado y Recibido
        PedidoProveedor.getManager.AddFilter("TipoEstadoPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Distinct, 3);
        PedidoProveedor.getManager.AddFilter("TipoEstadoPedidoProveedor", GenericManager<PedidoProveedor>.filterOperator.Distinct, 5);

        if (ddlProveedor.SelectedValue != "-1")
            PedidoProveedor.getManager.AddFilter("PROVEEDOR", GenericManager<PedidoProveedor>.filterOperator.Equals, ddlProveedor.SelectedValue);

        if (ViewState[pedidoViewStateOrdenKey] == null)
            PedidoProveedor.getManager.AddOrder("IdPedidoProveedor", GenericManager<PedidoProveedor>.Order.orderDirection.DESC);
        else
            PedidoProveedor.getManager.AddOrder(ViewState[pedidoViewStateOrdenKey].ToString(), (GenericManager<PedidoProveedor>.Order.orderDirection)ViewState[pedidoViewStateOrdenDireccionKey]);

        List<PedidoProveedor> lista = new List<PedidoProveedor>();
        lista = PedidoProveedor.getManager.GetFilter();
        grdPedidosProveedor.grdDatosAbmView.DataSource = lista;
        grdPedidosProveedor.grdDatosAbmView.DataBind();
    }

    private void seleccionarItemDetallePedidoProveedor(int o)
    {
        return;
    }

    private void cargarGrillaDetalle()
    {
        DetallePedidoProveedor lista = (DetallePedidoProveedor)Session["detallePedidoProveedor"];
        if (lista == null)
            grdDetallePedido.grdDatosAbmView.DataSource = null;
        else
            grdDetallePedido.grdDatosAbmView.DataSource = lista.ItemList;
        grdDetallePedido.grdDatosAbmView.DataBind();
    }

    #region "Modos"
    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                wzrABM.ActiveStepIndex = 0;
                break;
            case PageMode.NewMode:
            //no hay modo nuevo
            case PageMode.EditMode:
                wzrABM.ActiveStepIndex = 1;
                //principal
                txtID.Enabled = false;
                txtFechaCarga.ReadOnly = true;
                txtProveedor.ReadOnly = true;
                ddlInsumo.Enabled = true;
                txtMoneda.ReadOnly = true;
                txtTotal.ReadOnly = true;
                txtCantidad.ReadOnly = false;
                txtEstado.ReadOnly = true;
                txtEmpleado.ReadOnly = true;
                cmdAgregarDetalle.Enabled = true;
                btnAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                break;
            //            case PageMode.ViewMode:
            //no hay modo view
        }
    }

    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    #endregion

    private bool validar(PedidoProveedor objeto)
    {
        ValidationResults v = Validation.Validate<PedidoProveedor>(objeto);
        if (!v.IsValid)
        {
            _lblError.Text = "Error en el formulario: Por favor verifique los campos ingresados.";
        }
        return v.IsValid;
    }

    protected void btnAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            PedidoProveedor.getManager.ClearFilters();
            PedidoProveedor.getManager.AddFilter("IDPEDIDOPROVEEDOR", GenericManager<PedidoProveedor>.filterOperator.Equals, int.Parse(txtID.Text));
            PedidoProveedor objPedido = PedidoProveedor.getManager.GetOne();

            objPedido.DetallePedidoProveedor = (DetallePedidoProveedor)Session["detallePedidoProveedor"];

            if (validar(objPedido))
            {
                objPedido.IdPedidoProveedor = int.Parse(txtID.Text.Trim());
                if (PedidoProveedor.getManager.Update(objPedido) != true)
                {
                    throw PedidoProveedor.getManager.GeneratedException;
                }
                objPedido.SetState();
                guardarMovimientoStock();
                Session["detallePedidoProveedor"] = null;
                SetMode(PageMode.ListMode);
                cargarGrilla();
            }


            _lblError.Text = "";
            _lblErrorDetalle.Text = "";
        }
        catch (FormatException exc)
        {
            _lblError.Text = "Error en los tipos de datos.";
            Functions.LogError(exc);
        }
        catch (Exception exc)
        {
            _lblError.Text = "error: No se pudo realizar la operación.";
            Functions.LogError(exc);
        }
    }

    private void guardarMovimientoStock()
    {
        foreach (StockInsumos it in this.MovimientosDeStock)
        {
            StockInsumos.getManager.Insert(it);
        }
        this.MovimientosDeStock.Clear();
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        Session["detallePedidoProveedor"] = null;
        SetMode(PageMode.ListMode);
    }
    protected void cmdAgregarDetalle_Click(object sender, EventArgs e)
    {
        DetallePedidoProveedor objDetalle = new DetallePedidoProveedor();
        objDetalle = (DetallePedidoProveedor)Session["detallePedidoProveedor"];

        if (objDetalle == null)
            return;
        try
        {
            ItemDetallePedidoProveedor objItem;
            for (int i = 0; i < objDetalle.ItemList.Count; i++)
            {
                objItem = (ItemDetallePedidoProveedor)objDetalle.ItemList[i];
                if (objItem.Insumo.IdInsumo == int.Parse(ddlInsumo.SelectedValue))
                {
                    if (objItem.Cantidad >= decimal.Parse(txtCantidad.Text.Trim()))
                    {
                        objItem.CantidadRecibida = decimal.Parse(txtCantidad.Text.Trim());
                        actualizarMovimientoStock(objItem.Insumo, decimal.Parse(txtCantidad.Text.Trim()), DateTime.Now, Convert.ToInt32(txtID.Text));
                    }
                    else
                    {
                        _lblErrorDetalle.Text = "La cantidad recibida no puede superar a la cantidad solicitada.";
                        return;
                    }
                }
                objDetalle.ItemList[i] = objItem;
            }
            Session["detallePedidoProveedor"] = objDetalle;
            cargarGrillaDetalle();

            txtCantidad.Text = "";
            _lblErrorDetalle.Text = "";
        }
        catch (Exception ex)
        {
            _lblErrorDetalle.Text = ex.Message;
        }
    }

    private void actualizarMovimientoStock(Insumo insumo, decimal movimiento, DateTime fecha, Int32 idPedidoProveedor)
    {
       this.MovimientosDeStock.Add(StockInsumos.incorporarStockDesdePedido(insumo, movimiento, fecha, idPedidoProveedor));
        
    }


    public List<StockInsumos> MovimientosDeStock
    {
        get
        {
            List<StockInsumos> movimientosDeStock;

            movimientosDeStock = ViewState["movimientosDeStock"] as List<StockInsumos>;
            if (movimientosDeStock == null)
            {
                movimientosDeStock = new List<StockInsumos>();
                ViewState["movimientosDeStock"] = movimientosDeStock;
            }
            return movimientosDeStock;
        }
        set { ViewState["movimientosDeStock"] = value; }
    }

}
